package Chapter5;

//108页程序5.5
public class StringEqualsTest {
    public static void main(String[] args) {
        String s1="This is a test String!";
        String s2="This is a test String!";
        String s3=new String("This is a test String!");
        String s4=new String(s1);
        String s5=s1;

        //String类中，equals判断的是字符串内容是否相同，==判断的是是否为同一实例，即内存地址是否相同；若不是同一实例，即使内容相同，内存地址也不一样
        boolean s1s2a=s1.equals(s2);
        System.out.println("将s1和s2两个对象用equals方法判断是否相同："+s1s2a); //S1和S2都是相同的字符串常量，因此在内存中是同一地址，S1S2是引用变量指向同一内存地址
        boolean s1s2b= s1==s2;
        System.out.println("将s1和s2两个对象用==运算符判断是否相同："+s1s2b); //S1和S2都是相同的字符串常量，因此在内存中是同一地址，S1S2是引用变量指向同一内存地址


        boolean s1s3a =s1.equals(s3);
        System.out.println("将s1和s3两个不同方式创建的对象用equals方法判断是否相同："+s1s3a); //S1和S3的字符相同，因此使用equals方法结果为true
        boolean s1s3b = s1==s3;
        System.out.println("将s1和s3两个不同方式创建的对象用==运算符判断是否相同："+s1s3b); //由于S3是新创建的实例，因此有单独的内存空间，虽然字符内容一样，但地址不同，为false


        boolean s1s4a =s1.equals(s4);
        System.out.println("将s1和s4两个不同方式创建的对象用equals方法判断是否相同："+s1s4a); //S1和S4的字符相同，因此使用equals方法结果为true
        boolean s1s4b = s1==s4;
        System.out.println("将s1和s4两个不同方式创建的对象用==运算符判断是否相同："+s1s4b);
        //即使S4的字符串是从S1得到的，但由于是新创建的实例，因此有单独的内存空间，虽然字符内容一样，但地址不同，为false


        boolean s1s5a =s1.equals(s5);
        System.out.println("将s1和s5两个不同方式创建的对象用equals方法判断是否相同："+s1s5a); //S1和S5的字符相同，因此使用equals方法结果为true
        boolean s1s5b = s1==s5;
        System.out.println("将s1和s5两个不同方式创建的对象用==运算符判断是否相同："+s1s5b); //S1和S5都是相同的字符串常量，因此在内存中是同一地址，S1是引用变量指向S5并指向同一内存地址
        //S1和S5引用的是同一地址，可以互称为别名
    }
}
